/*
 * DIM-SUM操作系统 - 多核
 *
 * Copyright (C) 2023 国科础石(重庆)软件有限公司
 *
 * 作者: Dong Peng <w-pengdong@kernelsoft.com>
 *
 * License terms: GNU General Public License (GPL) version 3
 *
 */

#ifndef __ASM_SMP_H
#define __ASM_SMP_H

#ifndef __ASSEMBLY__
#include <dim-sum/process.h>
#include <dim-sum/cpu.h>
struct cpumask;
enum ipi_cmd_type;

#define INVALID_HARTID ULONG_MAX

#define smp_processor_id() (current_proc_info()->cpu)

#ifndef cpu_to_node
#define cpu_to_node(cpu)	((void)(cpu),0)
#endif

extern unsigned long __cpuid_to_hartid_map[MAX_CPUS];
#define cpuid_to_hartid_map(cpu)    __cpuid_to_hartid_map[cpu]

/**
 * 用于触发IPI的函数
 * 由硬件驱动设置
 */
extern void (*__smp_raise_ipi)(const struct cpumask *, unsigned int);
typedef void (*raise_ipi_call_fn)(const struct cpumask *, unsigned int);
/**
 * 硬件调用此函数，设置触IPI的函数指针
 */
extern void smp_set_raise_ipi_call(raise_ipi_call_fn fn);

/**
 * 向其他核发送IPI中断
 * 体系架构相关
 */
extern void
	arch_raise_ipi(const struct cpumask *mask, enum ipi_cmd_type cmd_type);

/**
 * IPI中断处理函数
 */
extern void do_IPI(int ipinr, struct exception_spot *regs);
void riscv_software_interrupt(void);
extern void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out);
void smp_setup_processor_id(void);
void __init init_smp(void);
void __init init_slave_early(void);
#endif /* __ASSEMBLY__ */

#endif /* __ASM_SMP_H */
